#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include "getline.h"

/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and
   NUL-terminate it).  *LINEPTR is a pointer returned from malloc (or
   NULL), pointing to *N characters of space.  It is realloc'ed as
   necessary.  Returns the number of characters read (not including
   the null terminator), or -1 on error or EOF.  
*/

ssize_t get_delim(char **lineptr, size_t *n, int delimiter, FILE *fp)
{
	ssize_t result;
	size_t cur_len = 0;

	if (lineptr == NULL || n == NULL || fp == NULL)
	{
		errno = EINVAL;
		return -1;
	}

	flockfile (fp);

	if (*lineptr == NULL || *n == 0)
	{
		*n = 120;
		*lineptr = (char *) malloc (*n);
		if (*lineptr == NULL)
      	{
			result = -1;
			goto unlock_return;
		}
	}

	for(;;)
    {
		int i = getc (fp);
		if (i == EOF)
		{
			result = -1;
			break;
		}

		/* Make enough space for len+1 (for final NUL) bytes.  */
		if (cur_len + 1 >= *n)
		{
			size_t needed_max = SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
			size_t needed = 2 * *n + 1;   /* Be generous. */
			char *new_lineptr;

			if (needed_max < needed)
				needed = needed_max;
			if (cur_len + 1 >= needed)
			{
				result = -1;
				goto unlock_return;
			}

			new_lineptr = (char *) realloc (*lineptr, needed);
			if (new_lineptr == NULL)
			{
				result = -1;
				goto unlock_return;
			}

			*lineptr = new_lineptr;
			*n = needed;
		}

		(*lineptr)[cur_len] = i;
		cur_len++;

		if (i == delimiter)
			break;
	}
  
	(*lineptr)[cur_len] = '\0';
	result = cur_len ? cur_len : result;

unlock_return:
	funlockfile (fp);
	return result;
}

ssize_t get_line(char **lineptr, size_t *n, FILE *stream)
{
	return get_delim(lineptr, n, '\n', stream);
}

/*
 * get value from key-value line, return void
*/
void get_word(char* pRawStr, const char* pCmpStr, char* pValueStr)
{
	char* pTmp = pRawStr + strlen(pCmpStr);
	int len= strlen(pTmp);
	int i=0, j=0;
	while(j<len)
	{
		if(pTmp[j] > 32 )
		{
			pValueStr[i++] = pTmp[j];
		}
		j++;
	}
}
